近期,阿联酋阿布扎比的技术创新研究所(TII)开源了 Falcon 系列模型,使用经过筛选的 1 万亿 tokens 进行预训练,并以 Apache 2.0 协议开源,可能是目前效果最好且许可协议最宽松(允许商用)的开源模型。然而,Falcon 模型在使用上面临和 LLaMA 模型类似的问题:由于模型主要在英文数据集上训练,因此它理解和生成中文的能力偏弱。此外,Falcon 在构建词表时没有加入中文字/词,中文字会被拆分成多个 token 的组合,这导致中文文本会被拆分成更长的 tokens 序列,降低了编码和生成效率。针对以上问题,“伶荔(Linly)”项目团队以 Falcon 模型为底座扩充中文词表,利用中文和中英平行增量预训练将模型的语言能力迁移学习到中文,实现 Chinese-Falcon。本文从模型结构上分析 Falcon、LLaMA 与传统 GPT 的异同,代码实现细节。并介绍我们的中文 Falcon 训练方案,包括中文字词扩充、数据集构建和训练参数等。项目地址:
https://github.com/CVI-SZU/Linly
模型结构
Falcon 与 GPT 系列一样采用单向 Transformer-decoder 模型架构,并以语言模型作为训练目标。与 GPT-3 相比,Falco 的结构具有如下变化:1. 位置编码:Falcon 使用旋转位置编码(RoPE),近期的大模型包括 GPT-Neo、PaLM 和 LLaMA 等都采用了 RoPE。
- 2. 注意力机制:使用 Multi-Query 将 key 和 value 映射到单个注意力头,只有 query 保留多头矩阵,这种简化方案能提升生成效率;使用 FlashAttention 将注意力矩阵分块,加速计算并降低内存 IO 开销。
3. Transformer:只使用单个 layer_norm 层,将 Attention 和 MLP 并行。
GPT、LLaMA 和 Falcon 的计算流程对比如图所示:从 Transformer 模型结构上看,LLaMA 将 Layer-Norm 层放在 Ateention 和 FFN 的输入,这样有助于大模型训练稳定性(由 GPT2 论文提出)。此外,FFN 部分使用了门控线性层(GLU),这种结构最初被用在 T5-1.1,实验效果优于 MLP。可以看出,LLaMA 的设计着重于性能提升,而 Falcon 对 Transformer 的改进着重于效率提升:将 Layer-Norm 层减少到一个并简化了注意力的计算(Multi-Query Attention),因此 Falcon 比 LLaMA 的生成速度更快。
Falcon模型实现
本章节介绍“伶荔(Linly)”项目中 Falcon 实现方案,我们使用 TencentPretrain 复现 Falcon 模型结构,用语言模型目标增量训练模型。TencentPretrain 是 UER-py 预训练框架的多模态版本,支持 BERT、GPT、T5、ViT、Dall-E、Speech2Text 等文本、图像和语音预训练模型及下游任务。TencentPretrain 基于模块化设计,可以通过模块组合的方式构成各种模型,也可以通过复用已有的模块进行少量修改来实现新的模型。在之前实现 LLaMA 时,我们基于 GPT2 模型结构,新增了 RoPE 和 RMSNorm 模块。进一步,根据 Falcom 的模型结构,新增了 FlashAttention(Multi-Query)模块,复用已有的 MLP、Transformer、LM_target 等模块,来复现 Falcon 模型。
值得注意的是,我们的实现与 Hugging Face 版本 Falcon 模型完全对齐,训练后的模型权重可以直接转换到 Hugging Face 使用,反之亦然。此外,我们复现的版本还改进了 Falcon 代码的兼容性:Falcon 在 Hugging Face 中为了高效训练使用了 F.scaled_dot_product_attention,它是 PyTorch 2.0 新增的函数。我们重写了这部分代码,当用户使用 1.x 版本时切换到我们的实现来兼容低版本 PyTorch。
Falcon中文训练
本章节介绍中文 Falcon 的训练流程和细节。首先扩充 Falcon 词表,包括 8,701 个常用汉字,jieba 词表中前 20,000 个中文高频词以及 60 个中文标点符号。去重后共增加 25,022 个 token,词表大小扩充为 90,046。改变词表后,embedding 和 target.output_layer 矩阵也要对应的扩充。我们将每个新增字/词在原始 tokenizer 中的对应向量的平均作为初始化。在第一阶段,我们使用了 50GB 数据进行预训练,其中 20G 中文通用语料为模型提供中文语言能力和中文知识,10G 中英文平行语料用于对齐模型的中英文表示,将英文语言能力迁移到中文上,20G 英文语料用于数据回放,缓解模型遗忘。数据已在 Linly 项目中公开,细节如图所示:
在模型训练阶段,我们使用与 Falcon 预训练相同的超参数设置:AdamW,ZeRO Optimizer,Batch size 2304,对于增量训练,我们设置更低的学习率 2e-5。为了避免训练中文 embeeding 时扰动已经训练好的模型参数,首先我们冻结 Transformer 权重,只更新 embedding 和 output_layer 部分,训练 16k steps 作为后续训练的初始化权重。进一步,在通用语料上全参数训练模型。部分收敛情况如下图所示:
除了第一阶段的 50GB 语料外,我们还将使用自建中文数据集和 SlimPajama 数据集共 2TB 语料训练中文 Falcon 基础模型,在伶荔项目中持续更新。https://github.com/CVI-SZU/Linly
https://github.com/Tencent/TencentPretrain#投 稿 通 道#
让你的文字被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析、科研心得或竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。
📝 稿件基本要求:
• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注
• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题
• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算
📬 投稿通道:
• 投稿邮箱:hr@paperweekly.site
• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者
• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿
△长按添加PaperWeekly小编
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧